using System;
using System.Collections.Generic;
using System.Linq;
using App.Modelo;
using App.Modelo.Interfaces;
using App.SolInf.Modelo;

namespace App.SolInf.Controlador
{
    public class ControladoraCompras : IControladora
    {
        public ISessionActual Session { get; set; }

        public IRepositorio Repositorio { get; set; }


        public void Alta(Compra compra)
        {
            compra.FechaAlta = DateTime.Now;
            
            // registro el movimiento de stock
            var movimiento = new Movimiento()
                {
                    Fecha = DateTime.Now,
                    Detalle = compra,
                    Empleado = Session.UsuarioActual,
                    Lineas = (from l in compra.Lineas
                              select new LineaMovimiento(l.Producto, l.Cantidad)).ToList()
                };

            Repositorio.SaveObject(movimiento);

            // actualizo los costos de productos
            foreach(var linea in compra.Lineas)
            {
                linea.Producto.Costo = linea.PrecioUnitario;
                Repositorio.UpdateObject(linea.Producto);
            }
                
            // guardo la compra
            Repositorio.SaveObject(compra);

        }


        public Movimiento GetMovimientoStock(Compra compra )
        {
          
            var param = new Dictionary<string, object>();
            param["Id"] = compra.Id;

            return Repositorio.GetList<Movimiento>( @"
                FROM Movimiento m 
                WHERE m.Detalle.class = App.SolInf.Modelo.Compra 
                  AND m.Detalle.Id = :Id",  param).First();

        }

        public IList<Compra> Buscar()
        {
            return Repositorio.GetAll<Compra>();
        }

        public void Modificar(Compra compra)
        {
            Repositorio.UpdateObject(compra);
            Repositorio.FlushSession();
        }

        public void Baja(Compra item)
        {
            Repositorio.DeleteObject(item);
            Repositorio.FlushSession();
        }
    }
}